CircleCIでのCI用設定について業務を通して組み立てた内容をまとめてみた
はじめに
CircleCIを実際に業務で利用し始めて、当初はローカルとの設定の違いにやや苦戦しつつも、ようやく色々と手間が省ける状態にまでたどり着けました。
実装とテストそしてレビューを通しながら追加していった現時点での設定内容を備忘録としてまとめてみました。
前提となる環境
以下の環境を前提とします。
- Python 3.7
- pipenv
環境設定
ベースは公式設定例を元にしています。
Configuring a Python Application on CircleCI - CircleCI
docker: - image: circleci/python:3.7.3 steps: - checkout - run: sudo chown -R circleci:circleci /usr/local/bin - run: sudo chown -R circleci:circleci /usr/local/lib/python3.7/site-packages - restore_cache: # このステップは依存関係をインストールする前に実行します key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }} - run: command: | pip install pipenv pipenv sync --dev - save_cache: key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }} paths: - ".venv" - "/usr/local/bin" - "/usr/local/lib/python3.7/site-packages"
docker
当初はmachineでの指定にする予定でしたが、バージョンが追いついていないためか、現時点でPython3.7指定にはdockerにする必要がありました。
テストの実行
boto3
を利用する前提で、各環境設定を適当に設定しています。moto
経由での実行のためエラーにはなりません。
- run: command: | export AWS_REGION_NAME='ap-northeast-1' export AWS_ACCESS_KEY_ID='test' export AWS_SECRET_ACCESS_KEY='test' pipenv run pytest tests
Lint
flake8
は通過するようにしています。flake8-import-order
も試してみましたが、isort
の挙動とうまくあわないこともあり外しました。
なお、警告にそった手作業を回避するためvim-autopep8
を併用しつつ、可視化のためにvim-gitgutter
を使っています。
- run: name: run linting and metrics command: | pipenv run flake8 src/ tests/
Pipfile
Lintに関わる箇所については現時点で以下の状態となっています。
[dev-packages] pytest = "*" flake8 = "*" pytest-cov = "*" moto = "*" isort = "*"
vim-autopep8
差分がないのにDiff表示されるのが辛いことと、airblade/vim-gitgutter
を利用していることもあり、autopep8_disable_show_diff
を有効にしています。
[[plugins]] repo = 'airblade/vim-gitgutter' hook_add = ''' let g:gitgutter_override_sign_column_highlight = 0 highlight SignColumn ctermbg=green highlight GitGutterAdd ctermfg=blue ctermbg=brown highlight GitGutterChange ctermfg=yellow ctermbg=brown highlight GitGutterDelete ctermfg=red ctermbg=brown highlight GitGutterChangeDelete ctermfg=blue ctermbg=brown ''' [[plugins]] repo = 'tell-k/vim-autopep8' hook_add = ''' let g:autopep8_on_save = 1 let g:autopep8_disable_show_diff=1 '''
設定全体 (.circleci/config.yml)
version: 2 jobs: build: docker: - image: circleci/python:3.7.3 steps: - checkout - run: sudo chown -R circleci:circleci /usr/local/bin - run: sudo chown -R circleci:circleci /usr/local/lib/python3.7/site-packages - restore_cache: # このステップは依存関係をインストールする前に実行します key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }} - run: command: | pip install pipenv pipenv sync --dev - save_cache: key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }} paths: - ".venv" - "/usr/local/bin" - "/usr/local/lib/python3.7/site-packages" - run: command: | export AWS_REGION_NAME='ap-northeast-1' export AWS_ACCESS_KEY_ID='test' export AWS_SECRET_ACCESS_KEY='test' pipenv run pytest tests - run: name: run linting and metrics command: | pipenv run flake8 src/ tests/
まとめ
当初は色々と手作業に迫られていましたが、設定を追加更新する毎に、
- リポジトリにPushするだけで一通りチェック
- 結果は基本Slackへの通知を見ていれば問題なし
と、CIの段階ながらもとても快適になりました。
CircleCIの設定で戸惑っている方の参考になれば幸いです。